package cn.hengzhu.main_manager.utils;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import cn.hengzhu.main_manager.repository.domain.ManageCase;
import cn.hengzhu.main_manager.repository.domain.ManageCaseBox;
import cn.hengzhu.main_manager.repository.domain.ManageCaseType;

/**
 * @author liuCheng
 * @since 2018年12月20日 上午10:42:35 用户使用费用计算
 */
public class CustomersAmountCount {

	private static Logger log = Logger.getLogger(CustomersAmountCount.class);
	/**
	 * @author liuCheng
	 * @since 2018年12月20日 下午12:08:03
	 * @return 中途取物的金额计算
	 */
	public static double getMidWayAliCharge(ManageCaseBox manageCaseBox, ManageCase manageCase,ManageCaseType manageCaseType) {
		double amount = 0;
		Date date = new Date();
		long time = 0;
		Byte size = manageCaseBox.getSize();
		Date saveTime = manageCaseBox.getSaveTime();
		Byte isSize = manageCase.getIsSize();
		Byte payTime = manageCaseType.getPayTime();
		String userTime = manageCaseType.getUserTime();
		String priceSize = manageCaseType.getPriceSize();
		String price = manageCaseType.getPrice(); // 小时收费的金额
		Byte payType = manageCaseType.getPayType();

		if (!Byte.valueOf("0").equals(payType)) {// 不是免费的才计算使用的金额
			if (Byte.valueOf("0").equals(isSize)) {// 不区分大小柜
				if (Byte.valueOf("1").equals(payTime)) {// 使用后收费
					if (Byte.valueOf("1").equals(payType)) { // 1.计时
						double useprice = Double.valueOf(price);
						long endTime = date.getTime();
						long startTime = saveTime.getTime();
						time = endTime - startTime;
						amount = getCharge(time, useprice, userTime);
					} else if (Byte.valueOf("2").equals(payType)) {// 计次
						amount = Double.valueOf(price);
					}
				} else {// 使用前收费
					if (Byte.valueOf("1").equals(payType)) { // 1.计时
						double useprice = Double.valueOf(price);
						long endTime = date.getTime();
						long startTime = saveTime.getTime();
						time = endTime - startTime;
						amount = getPayBeforeCharge(time, useprice, userTime);
						amount = amount + useprice;
					} else {
						amount = Double.valueOf(price);
					}
				}
			} else {// 区分大小柜
				double useprice = 0;
				List<String> asList = Arrays.asList(priceSize.split(","));
				if (Byte.valueOf("1").equals(size)) {// 1.大 2.中 3.小
					useprice = Double.valueOf(asList.get(0));
				} else if (Byte.valueOf("2").equals(size)) {
					useprice = Double.valueOf(asList.get(1));
				} else if (Byte.valueOf("3").equals(size)) {
					useprice = Double.valueOf(asList.get(2));
				}
				if (Byte.valueOf("1").equals(payTime)) {// 使用后收费
					if (Byte.valueOf("1").equals(payType)) {// 0，免费 1.计时//
						// 2.记次
						// 使用时间
						long startTime = saveTime.getTime();
						time = date.getTime() - startTime;
						amount = getCharge(time, useprice, userTime);
					} else if (Byte.valueOf("2").equals(payType)) {// 计次
						amount = useprice;
					}
				} else {
					if (Byte.valueOf("1").equals(payType)) {// 0，免费 1.计时//
						// 2.记次
						// 使用时间
						long endTime = date.getTime();
						long startTime = saveTime.getTime();
						time = endTime - startTime;
						amount = getPayBeforeCharge(time, useprice, userTime);
						amount = amount + useprice;
					} else {
						amount = useprice;
					}
				}
			}
		}
		String formatNumberCN = NumberHelper.formatNumberCN(amount, NumberHelper.NUMBER_IN_2_0);
		amount=Double.valueOf(formatNumberCN);
		//计时收费上限
		String feeCap = manageCaseType.getFeeCap();
		if(Byte.valueOf("1").equals(payType)&&StringUtils.isNoneBlank(feeCap)&&amount>Double.parseDouble(feeCap)){
			log.info("中途取物：计时收费上限为: 【"+feeCap+"】元");
			amount = Double.parseDouble(feeCap);
		}
		return amount;
	}

	/**
	 * @param time 使用时间 毫秒
	 * @param useprice 金额
	 * @param userTime 小时
	 * @author 刘成
	 * @since 2018年10月16日 计算金额的方法
	 */
	private static double getCharge(long time, double useprice, String userTime) {

		double usetime = Double.valueOf(userTime);

		// 将使用毫秒转为小时
		double paytime = new BigDecimal(time).divide(new BigDecimal(1000 * 60 * 60), 3, BigDecimal.ROUND_HALF_UP)
				.doubleValue();

		// 将小时向上取整
		int number = (int) ((paytime % usetime) > 0 ? (paytime / usetime) + 1 : paytime / usetime);
		double amount = useprice * number;
		String formatNumberCN = NumberHelper.formatNumberCN(amount, NumberHelper.NUMBER_IN_2_0); // 金额显示后两位小数
		amount=Double.valueOf(formatNumberCN);
		return amount;
	}



	/**
	 * @author liuCheng
	 * @since 2018年12月12日 下午5:40:15
	 * @param time 使用时长
	 * @param useprice 小时金额
	 * @param userTime 小时
	 * @return 开箱前收费的金额计算
	 */
	private static double getPayBeforeCharge(long time, double useprice, String userTime) {
		double usetime = Double.valueOf(userTime);

		// 转为小时
		double paytime = new BigDecimal(time).divide(new BigDecimal(1000 * 60 * 60), 3, BigDecimal.ROUND_HALF_UP)
				.doubleValue();
		// 使用时长向上取整
		int number = (int) ((paytime % usetime) > 0 ? (paytime / usetime) + 1 : paytime / usetime);

		double amount = useprice * (number - 1); // 因为开箱前是收费了一个小时的 所以减去一个小时
		String formatNumberCN = NumberHelper.formatNumberCN(amount, NumberHelper.NUMBER_IN_2_0);
		amount=Double.valueOf(formatNumberCN);
		return amount;
	}

	/**
	 * @param manageCase 柜子
	 * @param manageCaseBox 箱子
	 * @param manageCaseType 收费规则
	 * @author liuCheng
	 * @since 2018年12月20日 上午10:49:07
	 * @return 获取支付宝小程序的结算费用的金额
	 */

	public static double getAliCharge(ManageCaseBox manageCaseBox, ManageCase manageCase,
			ManageCaseType manageCaseType) {

		log.info("支付宝小程序的结算费用的金额");
		Byte isSize = manageCase.getIsSize(); //  是否区分大中小柜(1.是   0.否）
		Byte payType = manageCaseType.getPayType(); // 收费类型（0，免费  1.计时   2.记次）
		Byte payTime = manageCaseType.getPayTime(); // 收费时间（1.使用后收费  2.使用前收费）
		String price = manageCaseType.getPrice(); // 小时金额
		String priceSize = manageCaseType.getPriceSize(); // 区分大中小柜的价格字段（大中小按逗号分隔）
		String userTime = manageCaseType.getUserTime(); //计时时使用（计时收费的时间）单位小时
		Byte size = manageCaseBox.getSize(); // 柜子下的箱子大小（0.常规大小   1.大   2.中   3.小）
		Date saveTime = manageCaseBox.getSaveTime(); //存物时间

		double amount = 0;
		Date date = new Date();
		long time = 0;
		if (!Byte.valueOf("0").equals(payType)) {// 不是免费的才计算使用的金额

			if (Byte.valueOf("0").equals(isSize)) {// 不区分大小柜

				if (Byte.valueOf("1").equals(payTime)) {// 使用后收费
					if (Byte.valueOf("1").equals(payType)) { // 1.计时
						double useprice = Double.valueOf(price); //金额
						long endTime = date.getTime();
						long startTime = saveTime.getTime(); // 开始存物时间
						time = endTime - startTime; //取物时间 - 存物时间 得出存了多久
						log.info("使用后收费。。。。。");
						log.info("使用时间: " + time);
						amount = getCharge(time, useprice, userTime); // 算出金额
					} else if (Byte.valueOf("2").equals(payType)) {// 计次
						amount = Double.valueOf(price);
					}

				} else {// 使用前收费
					log.info("使用前收费。。。。。。");
					if (Byte.valueOf("1").equals(payType)) { // 1.计时
						log.info("计时。。。。");
						double useprice = Double.valueOf(price); // 小时金额
						long endTime = date.getTime();
						long startTime = saveTime.getTime();
						time = endTime - startTime; // 使用时长
						log.info("使用时间：" + time);
						amount = getPayBeforeCharge(time, useprice, userTime);
						log.info("金额：" + amount);
					}
				}
			} else {// 区分大小柜
				log.info("区分大小柜....");
				double useprice = 0; // 小时的价格
				List<String> asList = Arrays.asList(priceSize.split(",")); // 切分大中小柜
				if (Byte.valueOf("1").equals(size)) {// 箱子大小 1.大 2.中 3.小
					useprice = Double.valueOf(asList.get(0));
				} else if (Byte.valueOf("2").equals(size)) {
					useprice = Double.valueOf(asList.get(1));
				} else if (Byte.valueOf("3").equals(size)) {
					useprice = Double.valueOf(asList.get(2));
				}

				if (Byte.valueOf("1").equals(payTime)) {// 使用后收费
					log.info("使用后收费。。。。。");
					if (Byte.valueOf("1").equals(payType)) {// 0，免费 1.计时//
						// 2.记次
						// 使用时间
						long startTime = saveTime.getTime();
						time = date.getTime() - startTime;
						amount = getCharge(time, useprice, userTime);
						log.info("计时,使用时间 ：" + time + " amount:" + amount);
					} else if (Byte.valueOf("2").equals(payType)) {// 计次
						amount = Double.valueOf(price);
						log.info("计次,使用时间 ：" + time + " amount:" + amount);
					}
				} else { // 使用前收费
					if (Byte.valueOf("1").equals(payType)) {// 0，免费 1.计时//
						// 2.记次
						// 使用时间
						log.info("计时收费。。。。。。");
						long endTime = date.getTime();
						long startTime = saveTime.getTime();
						time = endTime - startTime;
						amount = getPayBeforeCharge(time, useprice, userTime);
						log.info("使用时间 ：" + time + " amount:" + amount +" userprice" + useprice);
					}
				}
			}
		}

		// amount 为收费的金额
		String formatNumberCN = NumberHelper.formatNumberCN(amount, NumberHelper.NUMBER_IN_2_0);
		amount=Double.valueOf(formatNumberCN);

		//计时收费上限， 如果费用大于上限 则赋值为上限值
		String feeCap = manageCaseType.getFeeCap(); // 计时时使用（收费上限）单位元
		if(Byte.valueOf("1").equals(payType) && StringUtils.isNoneBlank(feeCap) && amount > Double.parseDouble(feeCap)){
			log.info("结束使用：计时收费上限为: 【"+feeCap+"】元");
			amount = Double.parseDouble(feeCap);
		}
		return amount;
	}

}
